package com.ciwong.epaper.util;

import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.text.TextUtils;
import android.webkit.URLUtil;

import com.ciwong.epaper.R;
import com.ciwong.libs.utils.StringUtils;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.drawee.controller.BaseControllerListener;
import com.facebook.drawee.interfaces.DraweeController;
import com.facebook.drawee.interfaces.SimpleDraweeControllerBuilder;
import com.facebook.drawee.view.SimpleDraweeView;
import com.facebook.imagepipeline.common.ResizeOptions;
import com.facebook.imagepipeline.image.ImageInfo;
import com.facebook.imagepipeline.request.ImageRequest;
import com.facebook.imagepipeline.request.ImageRequestBuilder;
import com.nostra13.universalimageloader.core.assist.ImageSize;

import java.io.File;

/**
 * 设置图片 Created by Alan on 2016/10/24.
 */
public class IVUtils {

    public static ImageSize imageSize_w200_h200 = new ImageSize(200, 200);

    public static ImageSize imageSize_w200 = new ImageSize(200, 0);

    public static ImageSize imageSize_w500 = new ImageSize(500, 0);

    public static ImageSize imageSize_w350 = new ImageSize(350, 0);

    /**
     * 缩放质量 高 、中 、低
     */
    public static int heightQuality = 80;

    private static int lowQuality = 40;

    private static int middleQuality = 60;

    /**
     * 设置头像
     *
     * @param imageView 显示图片控件
     * @param url       图片地址
     */
    public static void setHeadImage(SimpleDraweeView imageView, String url) {
        Uri headUri;
        if (!TextUtils.isEmpty(url)) {
            String uri = getAliCropThumbnailUrl(url,
                    EConstants.headImageSize, heightQuality);
            headUri = Uri.parse(uri);
        } else {
            headUri = Uri.parse(EConstants.RES_SCHEME + File.separator
                    + R.mipmap.class_teach_avatar);
        }
        setImageURI(imageView, headUri);
    }

    /**
     * 设置动态列表的图片，(会将原图裁剪)
     *
     * @param imageView 显示图片控件
     * @param url       图片地址
     */
    public static void setContentImage(SimpleDraweeView imageView, String url) {
        if (url != null && url.startsWith("http")) {
            setImageView(imageView, imageSize_w200, url, lowQuality);
        } else {
            setImageFile(imageView, url);
        }

    }

    /**
     * 设置动态列表的图片(该方法主要用于设置专刊封面)
     *
     * @param imageView 显示图片控件
     * @param url       图片地址
     */
    public static void setImageWidth200(SimpleDraweeView imageView, String url) {
        setImageView(imageView, imageSize_w200, url, heightQuality);
    }

    /**
     * 设置动态列表的图片
     *
     * @param imageView 显示图片控件
     * @param url       图片地址
     */
    public static void setImageWidth500(SimpleDraweeView imageView, String url) {
        setImageView(imageView, imageSize_w500, url, heightQuality);
    }

    /**
     * 设置动态列表的图片
     *
     * @param imageView 显示图片控件
     * @param url       图片地址
     */
    public static void setImageWidth350(SimpleDraweeView imageView, String url) {
        setImageView(imageView, imageSize_w350, url, heightQuality);
    }

    /**
     * 设置自定义大小的图片
     *
     * @param imageView 显示图片控件
     * @param imageSize 图片大小(宽、高)
     * @param url       图片地址
     */
    public static void setImageURI(SimpleDraweeView imageView,
                                   ImageSize imageSize, String url) {
        setImageView(imageView, imageSize, url, middleQuality);
    }

    /**
     * 设置图片
     *
     * @param imageView 图片显示框
     * @param imageSize 图片大小
     * @param url       图片地址
     * @param quality   图片质量
     */
    public static void setImageView(SimpleDraweeView imageView,
                                    ImageSize imageSize, String url, int quality) {

        if (!TextUtils.isEmpty(url)) {
            String newUrl = getAliCropThumbnailUrl(url, imageSize,
                    quality);
            Uri contentUri = Uri.parse(newUrl);
            setImageURI(imageView, contentUri);
        }

    }

    /**
     * 设置自定义大小的图片
     *
     * @param imageView 显示图片控件
     * @param imageSize 图片大小(宽、高)
     * @param url       图片地址
     * @param quality   图片缩放质量(0-100之间)
     */
    public static void setImageURI(SimpleDraweeView imageView,
                                   ImageSize imageSize, String url, int quality) {
        setImageView(imageView, imageSize, url, quality);
    }

    /**
     * 设置图片(原图)
     *
     * @param imageView 显示图片控件
     * @param url       图片地址
     */
    public static void setImageURI(SimpleDraweeView imageView, String url) {
        if (!TextUtils.isEmpty(url)) {
            Uri uri = Uri.parse(url);
            setImageURI(imageView, uri);
        } else {
            imageView.setImageResource(-1);
        }
    }

    /**
     * 设置app资源图片
     *
     * @param imageView 显示图片控件
     * @param imgRes    资源图片地址
     */
    public static void setImageRes(SimpleDraweeView imageView, int imgRes) {
        Uri resUri = Uri.parse(EConstants.RES_SCHEME + File.separator + imgRes);
        setImageURI(imageView, resUri);
    }

    /**
     * 设置本地图片
     *
     * @param imageView 显示图片控件
     * @param filePath  本地图片地址
     */
    public static void setImageFile(SimpleDraweeView imageView, String filePath) {
        Uri fileUri = Uri
                .parse(EConstants.FILE_SCHEME + File.separator + filePath);
        setImageURI(imageView, fileUri);
        displayLargeImage(fileUri, imageView, options);
    }

    /**
     * 设置图片最终方法
     *
     * @param imageView 显示图片控件
     * @param uri       图片URI
     */
    public static void setImageURI(SimpleDraweeView imageView, Uri uri) {
        if (imageView != null && uri != null) {
            imageView.setImageURI(uri);
        }
    }

    private static ResizeOptions options = new ResizeOptions(200, 200);

    /**
     * 加载超大图片
     *
     * @param fileUri
     * @param draweeView
     * @param options
     */
    public static void displayLargeImage(Uri fileUri,
                                         SimpleDraweeView draweeView, ResizeOptions options) {
        ImageRequest request = ImageRequestBuilder.newBuilderWithSource(fileUri)
                .setResizeOptions(options).build();
        DraweeController controller = Fresco.newDraweeControllerBuilder()
                .setImageRequest(request)
                .setOldController(draweeView.getController())
                .setControllerListener(new BaseControllerListener<ImageInfo>())
                .build();
        draweeView.setController(controller);
    }

    private static SimpleDraweeControllerBuilder controller = Fresco
            .newDraweeControllerBuilder().setAutoPlayAnimations(true);


    /**
     * 设置 gif 图片原图
     *
     * @param draweeView
     * @param url
     */
    public static void setGifImage(SimpleDraweeView draweeView, String url) {
        if (draweeView == null || TextUtils.isEmpty(url)) {

            return;
        }
        Uri pictureUri;
        if (URLUtil.isHttpUrl(url) || URLUtil.isHttpsUrl(url)) {
            pictureUri = Uri.parse(url);
        } else {
            pictureUri = Uri.parse(EConstants.FILE_SCHEME + url);
        }
        if (url.endsWith(".gif")) {
            setGifImageUri(draweeView, pictureUri);
        } else {
            draweeView.setImageURI(pictureUri);
        }
    }

    /**
     * 设置gif动画
     *
     * @param draweeView
     * @param pictureUri
     */
    public static void setGifImageUri(SimpleDraweeView draweeView,
                                      Uri pictureUri) {
        controller.setUri(pictureUri);
        draweeView.setController(controller.build());
    }

    /**
     * 设置覆盖图片
     *
     * @param imageView
     * @param drawable
     */
    public static void setOverlay(SimpleDraweeView imageView, Drawable drawable) {
        if (imageView == null) {
            return;
        }
        if (imageView.getHierarchy() != null) {
            imageView.getHierarchy().setOverlayImage(drawable);
        }
    }

    /**
     * 移除覆盖
     *
     * @param imageView
     */
    public static void removeOverlay(SimpleDraweeView imageView) {

        if (imageView.getHierarchy() != null) {
            imageView.getHierarchy().setOverlayImage(null);
        }
    }

    /**
     * 开始播放gif
     *
     * @param fre
     * @param activity
     * @param drawable
     */
    public static void setGifUri(SimpleDraweeView fre, Activity activity,
                                 int drawable) {
        Uri uri = Uri
                .parse("res://" + activity.getPackageName() + "/" + drawable);
        DraweeController draweeController = Fresco.newDraweeControllerBuilder()
                .setUri(uri).setAutoPlayAnimations(true) // 设置加载图片完成后是否直接进行播放
                .build();
        fre.setController(draweeController);
    }

    /**
     * 获取缩略图Url
     *
     * @param url
     * @param mImageSize width,height的范围是[1,4096]
     * @return
     */
    public static String getPicturThumbnailUrl(String url, ImageSize mImageSize) {
        return getPicturThumbnailUrl(url, mImageSize, 60);
    }

    /**
     * 获取缩略图Url
     *
     * @param url
     * @param mImageSize width,height的范围是[1,4096]
     * @param quality    缩放质量（1-100之间）
     * @return
     */
    public static String getPicturThumbnailUrl(String url, ImageSize mImageSize,
                                               int quality) {
        if (url != null && mImageSize != null) {
            if (url.startsWith(EConstants.PICTUR_RULE)) {
                int index = url.indexOf("?");
                if (index == -1) {
                    return url + "?w=" + mImageSize.getWidth() + "&h="
                            + mImageSize.getHeight() + "";
                } else {
                    return url + "&w=" + mImageSize.getWidth() + "&h="
                            + mImageSize.getHeight() + "";
                }
            } else if (url.startsWith(EConstants.AVATAR_RULE)) {
                int index = url.indexOf("?");
                if (index == -1) {
                    int w = Math.min(mImageSize.getWidth(),
                            mImageSize.getHeight());
                    if (w <= 50) {
                        w = 50;
                    } else if (w > 50 & w <= 100) {
                        w = 100;
                    } else if (w > 100 & w <= 150) {
                        w = 150;
                    } else if (w > 150 & w <= 200) {
                        w = 200;
                    } else if (w > 200) {
                        w = 250;
                    }
                    return url + "/" + w;
                }
            } else if (url.startsWith(ALiYunManager.ACCESS_URL)
                    || url.startsWith(ALiYunManager.ACCESS_URL)) {
                url = getAliThumbnailUrl(url, mImageSize, quality);
                return url;
            }
        }
        return url;
    }

    /**
     * 获取阿里云服务按短边裁剪的缩略图Url
     *
     * @param url
     * @param mImageSize 高为0则按宽缩放 宽为0则按高缩放 width,height的范围是[1,4096]
     * @param quality    缩放质量（1-100之间）默认 60
     * @return
     */
    public static String getAliCropThumbnailUrl(String url,
                                                ImageSize mImageSize, int quality) {
        return getAliThumbnailUrl(url, mImageSize, quality, 0, 1, 1, null);
    }

    /**
     * 获取阿里云服务缩略图Url
     *
     * @param url
     * @param mImageSize 高为0则按宽缩放 宽为0则按高缩放 width,height的范围是[1,4096]
     * @param quality    缩放质量（1-100之间）默认 60
     * @return
     */
    public static String getAliThumbnailUrl(String url, ImageSize mImageSize,
                                            int quality) {

        return getAliThumbnailUrl(url, mImageSize, quality, 1, 0, null);
    }

    /**
     * 获取阿里云服务缩略图Url
     *
     * @param url
     * @param mImageSize 高为0则按宽缩放 宽为0则按高缩放 width,height的范围是[1,4096]
     * @param quality    缩放质量（1-100之间）默认 60
     * @param fileTail
     * @return
     */
    public static String getAliThumbnailUrl(String url, ImageSize mImageSize,
                                            int quality, String fileTail) {

        return getAliThumbnailUrl(url, mImageSize, quality, 1, 0, fileTail);
    }

    /**
     * 获取阿里云服务缩略图Url
     * <p>
     * 对缩略后的图片的大小有限制，目标缩略图的宽与高的乘积不能超过4096 * 4096， 而且单边的长度不能超过4096 * 4。
     *
     * @param url           原图片地址
     * @param mImageSize    高为0则按宽缩放 宽为0则按高缩放 width,height的范围是[0,4096] 可有一个值为0
     * @param quality       缩放质量（1-100之间）默认 60
     * @param isThumbnail   目标缩略图大于原图是否处理。值是1, 即不处理，是0，表示处理 默认是0
     * @param thumbnailType 缩放优先边 默认值为0：0表示按长边优先，默认值； 1表示按短边优先；2表示强制缩略；
     *                      由于图片缩放过程中，原图尺寸与缩放尺寸不一定是相同比例，需要指定以长边还是短边优先进行缩放，如原图200 *
     *                      400（比例1:2），需要缩放为100 * 100（比例1:1）.长边优先时，缩放为50
     *                      100；短边优先时(e=1)，缩放为`100 200`，若不特别指定，则代表长边优先
     * @param fileTail      后缀
     * @return
     */
    public static String getAliThumbnailUrl(String url, ImageSize mImageSize,
                                            int quality, int isThumbnail, int thumbnailType, String fileTail) {
        return getAliThumbnailUrl(url, mImageSize, quality, isThumbnail,
                thumbnailType, 0, fileTail);
    }

    /**
     * 获取阿里云服务缩略图Url
     * <p>
     * 对缩略后的图片的大小有限制，目标缩略图的宽与高的乘积不能超过4096 * 4096， 而且单边的长度不能超过4096 * 4。
     *
     * @param url           原图片地址
     * @param mImageSize    w h 高为0则按宽缩放 宽为0则按高缩放 width,height的范围是[0,4096] 可有一个值为0
     * @param quality       Q 缩放质量（1-100之间）默认 60
     * @param isThumbnail   l 目标缩略图大于原图是否处理。值是1, 即不处理，是0，表示处理 默认是0
     * @param thumbnailType e 缩放优先边 默认值为0：0表示按长边优先，默认值； 1表示按短边优先；2表示强制缩略；
     *                      由于图片缩放过程中，原图尺寸与缩放尺寸不一定是相同比例，需要指定以长边还是短边优先进行缩放，如原图200 *
     *                      400（比例1:2），需要缩放为100 * 100（比例1:1）.长边优先时，缩放为50
     *                      100；短边优先时(e=1)，缩放为`100 200`，若不特别指定，则代表长边优先
     * @param c             是否进行裁剪。如果是想对图进行自动裁剪，必须指定为1
     * @param fileTail      后缀
     * @return
     */
    public static String getAliThumbnailUrl(String url, ImageSize mImageSize,
                                            int quality, int isThumbnail, int thumbnailType, int c,
                                            String fileTail) {
        if (url == null || "".equals(url)) {
            return url;
        }
        // 判断url已经是缩略方式
        if (url.contains("@")) {
            return url;
        }
        if (fileTail == null) {
            if (url.endsWith(".gif")) {

                fileTail = ".gif";
            } else {
                fileTail = ".jpg";
            }
        }
        // 判断url是否支持该缩略方式
        if (url.startsWith(ALiYunManager.ACCESS_URL)
                || url.startsWith(ALiYunManager.ACCESS_URL)) {
            // 缩放质量
            int q = 60;
            if (quality > 0 && quality < 101) {
                q = quality;
            }
            // 目标缩略图大于原图是否处理
            int l = 0;
            if (isThumbnail >= 0 && isThumbnail <= 1) {
                l = isThumbnail;
            }
            // 缩放优先边
            int e = 0;
            if (thumbnailType >= 0 && thumbnailType <= 2) {
                e = thumbnailType;
            }
            if (mImageSize != null) {
                if (mImageSize.getWidth() == 0 && mImageSize.getHeight() > 0) {
                    url = url + "@" + mImageSize.getHeight() + "h_" + l + "l_"
                            + e + "e_" + c + "c_" + q + "Q" + fileTail;
                } else if (mImageSize.getHeight() == 0
                        && mImageSize.getWidth() > 0) {
                    url = url + "@" + mImageSize.getWidth() + "w_" + l + "l_"
                            + e + "e_" + c + "c_" + q + "Q" + fileTail;
                } else if (mImageSize.getHeight() > 0
                        && mImageSize.getWidth() > 0) {
                    url = url + "@" + mImageSize.getWidth() + "w_"
                            + mImageSize.getHeight() + "h_" + l + "l_" + e
                            + "e_" + c + "c_" + q + "Q" + fileTail;
                } else {
                    url = url + "@" + q + "Q" + fileTail;
                }
            } else {
                url = url + "@" + q + "Q" + fileTail;
            }
            return url;
        }
        return url;
    }

    /**
     * 获取阿里云图片区域裁剪 用户可以指定对某一个区域进行裁剪.在这里把图片分成９个区域.
     * 参数格式：<width>x<height>-<pos>rc.jpg 此方法只裁剪不缩放
     *
     * @param url
     * @param mImageSize width,height的范围是[1,4096]
     * @param rc         rc取值范围是[1,9],默认是左上角,区域数值对应表见下图如果想裁剪左上角，宽度是100,
     *                   高度是200的区域，参数是：100x200-1rc如果想裁剪左上角，宽度是100,高度是图片的原高度参数是：100x0-1rc
     *                   或者100x-1rc如果高度或者宽度不填，或者参数是0，或者参数大于原图.默认是按原图的高度或宽度返回.
     * @return
     */
    public static String getAliCropUrl(String url, ImageSize mImageSize, int rc,
                                       int quality) {
        if (url == null) {
            return url;
        }
        // 缩放质量
        int q = 60;
        if (quality > 0 && quality < 101) {
            q = quality;
        }
        if (rc < 1 || rc > 9) {
            rc = 5;
        }
        // 判断url是否支持该裁剪方式
        if (url.startsWith(ALiYunManager.ACCESS_URL)
                || url.startsWith(ALiYunManager.ACCESS_URL)) {
            if (mImageSize != null) {
                url = url + "@" + mImageSize.getWidth() + "x"
                        + mImageSize.getHeight() + "-" + rc + "rc_" + q
                        + "Q.jpg";
            }
        }
        return url;
    }
}
